package jobs

import (
	"context"
	cron "cronjob_work/common/crons"
	"github.com/gogf/gf/v2/frame/g"
	"sync"
)

var (
	MainCron *cron.Cron
	workPool chan bool
	lock     sync.Mutex
)

func Init(ctx context.Context, size int) {
	workPool = make(chan bool, size)
	MainCron = cron.New()
	MainCron.Start(ctx)
}

func AddJob(ctx context.Context, spec string, job *Job) bool {
	lock.Lock()
	defer lock.Unlock()

	if GetEntryById(job.JobKey) != nil { //如果存在则不作处理,这里调整为分布式锁
		return false
	}

	if err := MainCron.AddJob(spec, job); err != nil {
		g.Log().Error(ctx, "AddJob: ", err.Error())
		return false
	}

	return true
}

func RemoveJob(jobKey int) {
	MainCron.RemoveJob(func(e *cron.Entry) bool {
		if v, ok := e.Job.(*Job); ok {
			if v.JobKey == jobKey {
				return true
			}
		}

		return false
	})
}

func GetEntryById(jobKey int) *cron.Entry {
	entries := MainCron.Entries()
	for _, e := range entries {
		if v, ok := e.Job.(*Job); ok {
			if v.JobKey == jobKey {
				return e
			}
		}
	}

	return nil
}

func GetEntries(size int) []*cron.Entry {
	ret := MainCron.Entries()
	if len(ret) > size {
		return ret[:size]
	}
	return ret
}
